<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>设计模式——简单工厂模式</title>
    <!-- 引入核心的js文件 -->
    <script type="application/javascript" charset="utf-8" src="../../common/CommonUtils.js"></script>
    <script type="application/javascript" charset="utf-8">
        // 搭建一个简单的工厂环境  卖车的商店
        function CarShop () {};
        // 商店得有一个卖车的方法  考虑的效率的问题  将该方法加到商店得原型对象上
        // 此处采用的是简单原型对象的方法
        CarShop.prototype = {
            // 首先，将对象的构造器还原
            constructor : CarShop ,
            // 卖车的方法  传入一个参数  买的车类型
            sellCar : function (type) {
                var car; // 定义变量，用于保存从汽车生产工厂出来的车
                // 通过工厂生产车
                car = CarFactory.createCar(type);
                return car;
            }
        };

        // 建造一个工厂，专门用来生产汽车
        // 当销售汽车的商店需要汽车的时候
        // 直接从工厂中拿
        var CarFactory = {
            createCar : function (type) {
                var car; // 定义一个变量，保存生产的汽车
                switch (type) {
                    case 'Benz': car = new Benz(); break;
                    case 'Bmw' : car = new Bmw(); break;
                    case 'Audi': car = new Audi(); break;
                    default: 'not buy car';
                }
                // 汽车出厂前的检查，是否已实现接口的全部方法
                WL.Interface.ensureImplements(car, CarInterface);
                return car;
            }
        };

        // 接口对象实例，构造一个汽车类的接口实例
        var CarInterface = new WL.Interface(CarInterface, ['start','run']);

        // 定义一个汽车的基类，去实现汽车接口实例
        // supperClass implements CarInterface
        function BaseCar () {};
        // 在汽车基类的原型对象上实现接口的方法
        BaseCar.prototype = {
            // 首先，还原对象的构造器
            constructor : BaseCar ,
            // 实现接口中的start方法
            start : function () {
                alert(this.constructor.name + ' is starting ..');
            },
            // 实现接口中的run方法
            run : function () {
                alert(this.constructor.name + ' is runing ..');
            }
        };

        // Car Class   benz bmw audi (都是车)
        // 此处需要注意的是，子类特有的方法要在继承之后扩展
        // 简单来说就是，先继承，后扩展
        function Benz () {};
        WL.extend(Benz, BaseCar);
        // 扩展子类自己的方法
        Benz.prototype.driver = function () {alert('Benz driver ...');};

        function Bmw () {};
        WL.extend(Bmw, BaseCar);

        function Audi () {};
        WL.extend(Audi, BaseCar);

        // 实例化一个卖车的商店
        var shop = new CarShop();
        var car = shop.sellCar('Benz');
        car.start();
        car.driver();
    </script>
</head>
<body>

</body>
</html>